﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.BDServices;
using System.Drawing;

namespace TCC_Hotel.Apresentacao.Reservas
{
    public partial class ListarReservasFaturadas : System.Web.UI.Page
    {
        List<Reserva_Faturada> reservaHospedeFaturado = null;
        ReservaService servico = new ReservaService();
        ApartamentoService servico_Apartamento = new ApartamentoService();
        FluxoHospedesService servico_fluxoHospedes = new FluxoHospedesService();
        ParametroService servico_Parametro = new ParametroService();
        TimeSpan HorarioCheckIn;

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Reservas)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //recupera os parametros
            List<Parametros> parametrosAtuais = servico_Parametro.RecuperarParametros();
            string horaCheckinParametro = parametrosAtuais.Where(i => i.Codigo == "Horario_CheckIn").FirstOrDefault().Valor;

            lblCheckOut.Text = "Horário máximo para o check-out: " + parametrosAtuais.Where(i => i.Codigo == "Horario_CheckOut").FirstOrDefault().Valor;
            lblCheckIn.Text = "Horário mínimo para o check-in: " + horaCheckinParametro;

            string[] arrayHora = horaCheckinParametro.Split(':');
            HorarioCheckIn = new TimeSpan(Convert.ToInt32(arrayHora[0]), Convert.ToInt32(arrayHora[1]), Convert.ToInt32(arrayHora[2]));

     
            if (!IsPostBack)
            {
                //limpa o chache existente para pegar os dados mais atualizados
                HttpContext.Current.Cache.Remove("Lista_Reserva_Faturada");
                HttpContext.Current.Cache.Remove("Lista_Fluxo_Hospedes_Faturados");
                
                //recupera todos os hóspedes faturados do banco de dados          
                ReloadGridView();
            }
        }

        /// <summary>
        /// Faz o reload do gridview quando necessário e consulta o cache
        /// </summary>
        private void ReloadGridView()
        {

            //Consulta as reservas de hóspedes faturados no banco e verifica o cache
            reservaHospedeFaturado = servico.ListarReservasFaturadasCache();

            if (ckbFuturas.Checked == true)
            {
                reservaHospedeFaturado = reservaHospedeFaturado.Where(i => i.Empresa_Reserva.ToUpper().Contains(txtBusca.Text.ToUpper()) && i.NoHotel == false).OrderBy(i => i.Data_Inicio).ToList();
            }
            else
            {
                reservaHospedeFaturado = reservaHospedeFaturado.Where(i => i.Empresa_Reserva.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(i => i.Data_Inicio).ToList();
            }




            //popular gridView
            grdReservasFaturados.DataSource = reservaHospedeFaturado;
            grdReservasFaturados.DataBind();


        }

        /// <summary>
        /// Evento do botão de filtrar os nomes para facilitar a busca
        /// </summary>
        protected void btnBusca_Click(object sender, EventArgs e)
        {
            ReloadGridView();
        }

        /// <summary>
        /// Limpa a busca
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtBusca.Text = null;
            ReloadGridView();
        }
        /// <summary>
        /// Direciona o usuário para o mapa de reservas
        /// </summary>
        protected void btnMapa_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Apresentacao/Reservas/MapaReservas.aspx");
        }


        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }

        /// <summary>
        /// Evento que controla a paginação e verifica o cache
        /// </summary>
        protected void grdReservasFaturados_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //Consulta as resveras de hóspedes faturados no banco e verifica o cache
            reservaHospedeFaturado = servico.ListarReservasFaturadasCache();

            if (ckbFuturas.Checked == true)
            {
                reservaHospedeFaturado = reservaHospedeFaturado.Where(i => i.Empresa_Reserva.ToUpper().Contains(txtBusca.Text.ToUpper()) && i.NoHotel == false).OrderBy(i => i.Data_Inicio).ToList();
            }
            else
            {
                reservaHospedeFaturado = reservaHospedeFaturado.Where(i => i.Empresa_Reserva.ToUpper().Contains(txtBusca.Text.ToUpper())).OrderBy(i => i.Data_Inicio).ToList();
            }

            //Na mudança de pagina, chama o evento de aparecer a lista
            grdReservasFaturados.PageIndex = e.NewPageIndex;

            //popular gridView
            grdReservasFaturados.DataSource = reservaHospedeFaturado;
            grdReservasFaturados.DataBind();
        }

        /// <summary>
        /// Evento de click em algum dos botões 
        /// </summary>
        protected void grdReservasFaturados_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            //Verifica qual o botão que o usuário clicou
            if (e.CommandName == "detalharReserva")
            {
                //Verifica a quantidade maxima de hóspede nesse quarto para passar para a próxima tela
                string apartamento = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[3].Text;
                int numero_Hospedes = servico_Apartamento.RecuperarDetalhesApartamento(Convert.ToInt32(apartamento)).QntMaximaHospedes;
                string dataFim = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[5].Text;
                string id = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;

                //Redireciona para a pagina de detalhes correspondente com o CPF como parametro
                Response.Redirect("~/Apresentacao/Reservas/DetalharReservasFaturadas.aspx?numeroHospedes=" + numero_Hospedes + "&id=" + id + "&dataFim=" + dataFim);

            }
            else if (e.CommandName == "editarReserva")
            {
                //Verifica a quantidade maxima de hóspede nesse quarto para passar para a próxima tela
                string apartamento = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[3].Text;
                int numero_Hospedes = servico_Apartamento.RecuperarDetalhesApartamento(Convert.ToInt32(apartamento)).QntMaximaHospedes;
                string id = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;


                //Redireciona para a pagina de editar correspondente com o CPF como parametro
                Response.Redirect("~/Apresentacao/Reservas/EditarReservasFaturadas.aspx?numeroHospedes=" + numero_Hospedes + "&numeroApartamento=" + apartamento + "&id=" + id);
            }
            else if (e.CommandName == "cancelarReserva")
            {
                string id = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;

                //chama o servico que cancela uma reserva faturada e verifica se o essa foi cancelada com sucesso
                if (servico.CancelarReservaFaturada(Convert.ToInt32(id)))
                {
                    //Remove o cache para atualizar informação
                    HttpContext.Current.Cache.Remove("Lista_Reserva_Faturada");

                    MensagemJS("Reserva cancelada com sucesso!");
                }
                else
                {
                    MensagemJS("Ocorreu um erro e a reserva não foi cancelada!");
                }

                //Faz o reload da pagina para não perder os valores do "cancelar"
                ReloadGridView();
            }
            else if (e.CommandName == "efetuarCheckIn")
            {
                //recupera o minimo horario para check-in
                DateTime CheckIn = Convert.ToDateTime(grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[4].Text);
                //recupera o horario atual
                TimeSpan horaAtual = DateTime.Now.TimeOfDay;

                //verifica se está na hora de fazer o check-in
                if (horaAtual > HorarioCheckIn || CheckIn < DateTime.Now.Date)
                {
                    //Verifica a quantidade maxima de hóspede nesse quarto para passar para a próxima tela
                    string apartamento = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[3].Text;
                    int numero_Hospedes = servico_Apartamento.RecuperarDetalhesApartamento(Convert.ToInt32(apartamento)).QntMaximaHospedes;
                    string id = grdReservasFaturados.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text;
                    
                    //Redireciona para a pagina de editar correspondente com o CPF como parametro
                    Response.Redirect("~/Apresentacao/CheckIn/TelaCheckIn.aspx?numeroHospedes=" + numero_Hospedes + "&numeroApartamento=" + apartamento + "&id=" + id);
                }
                else
                {
                    lblCheckIn.ForeColor = Color.Red;
                    lblCheckIn.Focus();

                    //recarrega para não perder os valores atuais
                    ReloadGridView();
                }
            }
        }

        /// <summary>
        /// Evento de click do checkbox
        /// </summary>
        protected void ckbFuturas_CheckedChanged(object sender, EventArgs e)
        {
            //recupera todos as reservas do banco de dados  
            ReloadGridView();
        }

        /// <summary>
        /// Evento chamado a cada nova linha criada. O evento verificará se a reserva ja não esta vencida 
        /// Se sim
        /// ele desabilita o botão de cancelar, ou se não deixa habilitado
        /// </summary>
        protected void grdReservasFaturados_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            DateTime valueFinal = new DateTime();
            DateTime valueInicial = new DateTime();
            List<Fluxo_Hospedes> listaHospedesPresentes = null;

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string empresa = (DataBinder.Eval(e.Row.DataItem, "Empresa_Reserva")).ToString();
                ((LinkButton)e.Row.Cells[8].Controls[0]).OnClientClick = "return confirm('Deseja realmente cancelar a reserva da empresa " + empresa + "?');";
          

                //Pega o valor correspondente a coluna data final
                valueFinal = Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "Data_Final"));

                //Pega o valor correspondente a coluna data final
                valueInicial = Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "Data_Inicio"));

                //Se value for menor que o dia atual desabilita o botao cancelar
                if (valueFinal < DateTime.Today && !(valueFinal == DateTime.Now.AddDays(-1).Date && DateTime.Now.Hour >= 0 && DateTime.Now.Hour < 12))
                {
                    e.Row.Cells[8].Text = "";
                    e.Row.Cells[6].Text = "";
                }

                //Se value_inicial for o dia atual habilita o botao de check-in
                if (!(valueInicial <= DateTime.Today && valueFinal >= DateTime.Today) && !(valueFinal == DateTime.Now.AddDays(-1).Date && DateTime.Now.Hour >= 0 && DateTime.Now.Hour < 12))
                {
                    if (valueFinal < DateTime.Today)
                    {
                        e.Row.Cells[9].Text = "Não realizado";
                        e.Row.Cells[9].ForeColor = Color.Red;
                        e.Row.Cells[9].BorderColor = Color.DarkBlue;
                    }
                    else
                        e.Row.Cells[9].Text = "";
                }
                listaHospedesPresentes = servico_fluxoHospedes.ListarFluxoHospedesFaturadosCache();

                if (listaHospedesPresentes.Select(i => i.ID).Contains(Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "ID"))))
                {
                    e.Row.Cells[8].Text = "";
                    e.Row.Cells[9].Text = "Realizado";
                    e.Row.Cells[9].ForeColor = Color.Green;
                }

            }


        }

    }
}